package com.zhw.cloud.filter;

import javax.servlet.http.HttpServletRequest;

import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
/**
 * 自定义，zuul的过滤实现
 * zuul除了具有智能路由功能之外，还能进行过滤，添加一些安全验证等。
 * 实现类需要继承ZuulFilter，并实现其方法
 * 
 * @Component 必须通过此注解，注册到springBoot
 * @author hongwei.zhang
 */
@Component
public class MyFilter extends ZuulFilter {
	/**
	 * 过滤器的具体逻辑。可用很复杂，包括查sql，nosql去判断该请求到底有没有权限访问
	 */
	@Override
	public Object run() {
		RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){}
        }
        return null;
	}
	/**
	 * 在这里可以写逻辑判断，是否要过滤，本文true,永远过滤。
	 * @return 返回true，代表进行过滤，执行run方法。
	 * 		       返回false,代表不过滤，不执行run方法。
	 */
	@Override
	public boolean shouldFilter() {
		RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String filter = request.getParameter("filter");
        if("1".equals(filter)) {
        	return true;
        }else {
        	return false;
        }
	}
	/**
	 * 过滤的顺序 
	 */
	@Override
	public int filterOrder() {
		return FilterConstants.DEBUG_FILTER_ORDER;
	}
	/**
	 * pre：路由之前
	 * routing：路由之时
	 * post： 路由之后
	 * error：发送错误调用
	 * 这里取值用FilterConstants提供的变量，也可以直接手写字符串。
	 */
	@Override
	public String filterType() {
		return FilterConstants.PRE_TYPE;
	}

}
